package com.platform.comm.common.service;

import com.platform.comm.entity.CommBatchInfoEntity;
import com.platform.comm.exceptions.ValidationException;
import com.platform.comm.validation.groups.Batch;
import com.platform.vo.ImportDto;
import com.platform.comm.common.batch.ComBatchContext;
import com.platform.comm.common.batch.ComBatchExportContext;
import org.springframework.batch.item.database.Order;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * description: 通用批量导入业务接口
 *
 * @author lx
 */
public interface ComImportService {
    ValidatorFactory FACTORY = Validation.buildDefaultValidatorFactory();
    String BATCH_IMPORT_REPEAT_REDIS_KEY = "import:redis:repeat:%s";
    String [] FIELDS = {"sheetName","sheetNum","titleRowNum","rowBegin","colBegin"};

    /**
     * 根据上下文 对数据进行转换
     *
     * @param context 上下文
     * @param dto     上传的数据
     */
    void translateImport(ComBatchContext context, ImportDto dto);


   /**
    * 根据上下文对上传的数据进行校验
    * @param context 批处理上下文
    * @param dto     数据传输对象
    * @throws ValidationException 验证异常
    */
    void validateImport(ComBatchContext context, ImportDto dto) throws ValidationException;


    /**
     * 校验导入数据是否重复
     * @param context 上下文
     * @param dto 数据
     * @return  返回值
     */
    ImportDto repeatImport(ComBatchContext context, ImportDto dto);

    /**
     * 获取创建批处理信息
     * @param jobId 任务id
     * @return  批处理信息
     */
    CommBatchInfoEntity getNewExportJob(Long jobId);

    /**
     * 插入导入数据
     * @param context 上下文
     * @param dto     数据
     */
    void insertDto(ComBatchContext context, ImportDto dto);

    /**
     * 导出转换数据
     *
     * @param context 上下文
     * @param item    数据
     * @return 返回数据
     */
    Map<String, String> translateExport(ComBatchContext context, ImportDto item);

    /**
     * 验证器
     *
     * @param t   参数
     * @param <T> 类
     * @return 返回错误信息
     */
    default <T> List<String> validate(T t) {
        Validator validator = FACTORY.getValidator();
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(t, Batch.class);
        return constraintViolations.stream().map(ConstraintViolation::getMessage).collect(Collectors.toList());
    }

    /**
     * 业务名称
     *
     * @return 业务名称
     */
    String getName();

    /**
     * 业务类型
     *
     * @return 业务类型
     */
    String getImportType();

    /**
     * 进行导出数据转换
     *
     * @param context 上下文
     * @param item    数据
     * @return 返回值
     */
    String transformExport(ComBatchExportContext context, Map<String, Object> item);

    /**
     * 导出获取默认参数
     *
     * @param params 参数
     * @return 值
     */
    String getDefaultConditions(Map<String, String> params);

    /**
     * 导出获取查询参数
     *
     * @param params 参数
     * @return 值
     */
    String getCustomConditions(Map<String, String> params);


    /**
     * 导出获取排序
     *
     * @return 值
     */
    Map<String, Order> getSortedKeyMap();

    /**
     * 导出获取字典类型的字段集合
     * @return 值
     */
    Map<String, Object> getEnumFieldMap();

    /**
     * 业务类型
     *
     * @return 业务类型
     */
    String getExportType();

    /**
     * 清楚redis缓存
     */
    void clearRedis();
}
